/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import conexao.Conexao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import modelo.Produto;

public class ProdutoDAO {
    
    private Connection conexao;
    private PreparedStatement stmt;
    private ResultSet rs;
    private String sql;
    
    public ProdutoDAO() throws Exception {
        try {
            this.conexao = Conexao.getConexao();
        } catch (Exception ex) {
            throw new Exception("Erro: " + ex.getMessage());
        }
    }

    public void finalizar() throws Exception {
        try {
            Conexao.closeConexao(this.conexao, this.stmt, this.rs);
        } catch (SQLException ex) {
            throw new Exception("Erro ao finalizar " + ex);
        }
    }
    
    public void incluir(Produto produto) throws Exception {
        try {
            sql = "insert into Produto (ID, NOME, UNIDADE, VALOR, QTDESTOQUE, " + 
                  "QTDESTOQUEMINIMA, FABRICANTE, FORNECEDOR, DISPONIVELVENDA) values (?, ?, ?, ?, ?, ?, ?, ?, ?)";
            stmt = conexao.prepareStatement(sql);
            
            stmt.setInt(1, produto.getId());
            stmt.setString(2, produto.getNome());   
            stmt.setString(3, produto.getUnidade());                    
            stmt.setFloat(4, produto.getValor());
            stmt.setFloat(5, produto.getQtdEstoque());
            stmt.setFloat(6, produto.getQtdEstoqueMinima());
            stmt.setInt(7, produto.getFabricante().getId());
            stmt.setInt(8, produto.getFornecedor().getId());                    
            stmt.setString(9, produto.getDisponivelVenda());
            
            stmt.execute();
            stmt.close();
        } catch (SQLException ex) {
            throw new Exception("Erro ao incluir " + ex);
        }
    }

    public void alterar(Produto produto) throws Exception {
        try {
            sql = "update Produto set NOME=? where ID=?";
            stmt = conexao.prepareStatement(sql);
            stmt.setString(1, produto.getNome());
            stmt.setInt(2, produto.getId());
            stmt.execute();
            stmt.close();
        } catch (SQLException ex) {
            throw new Exception("Erro ao alterar " + ex);
        }
    }

    public void excluir(Integer id) throws Exception {
        try {
            sql = "delete from Produto where ID=?";
            stmt = conexao.prepareStatement(sql);
            stmt.setInt(1, id);
            stmt.execute();
            stmt.close();
        } catch (SQLException ex) {
            throw new Exception("Erro ao excluir " + ex);
        }
    }

    public Produto consultar(Integer id) throws Exception {
        try {
            sql = "select * from Produto where ID=?";
            stmt = conexao.prepareStatement(sql);
            stmt.setInt(1, id);
            rs = stmt.executeQuery();
            Produto produto = new Produto();
            if (rs.next()) {
                produto.setId(rs.getInt("id"));
                produto.setNome(rs.getString("nome"));
            }
            rs.close();
            stmt.close();
            return produto;
        } catch (SQLException ex) {
            throw new Exception("Erro ao consultar " + ex);
        }    
    }    
    
    public List<Produto> listar() throws Exception {
        try {
            sql = "select * from Produto order by NOME";
            stmt = conexao.prepareStatement(sql);
            rs = stmt.executeQuery();
            List<Produto> produtos = new ArrayList<Produto>();
            FabricanteDAO fab_dao  = new FabricanteDAO();
            FornecedorDAO fornec_dao = new FornecedorDAO();
            
            while (rs.next()) {
                Produto produto = new Produto();
                produto.setId(rs.getInt("id"));
                produto.setNome(rs.getString("nome"));
                produto.setUnidade(rs.getString("unidade"));                        
                produto.setValor(rs.getFloat("valor"));
                produto.setQtdEstoque(rs.getFloat("qtdestoque"));
                produto.setQtdEstoqueMinima(rs.getFloat("qtdestoqueminima"));
                produto.setFabricante(fab_dao.consultar(rs.getInt("fabricante")));
                produto.setFornecedor(fornec_dao.consultar(rs.getInt("fornecedor")));
                produto.setDisponivelVenda(rs.getString("disponivelvenda"));
                
                produtos.add(produto);
            }
            rs.close();
            stmt.close();
            return produtos;
        } catch (SQLException ex) {
            throw new Exception("Erro ao listar " + ex);
        }
    }        
    
}
